#include "gameObjects.h"

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//                                                       //
//                       SHIP                            //
//                                                       //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

/**********************************************************
 * Ship Functions start here
 **********************************************************/
Ship::Ship() : Shootable()
{
   setX(0);
   setY(0);
   m_shipAngle = 0;
}

/**********************************************************
 * event : handles input for ship
 **********************************************************/
void Ship::event(int up, int left, int right)
{
   m_shipAngle = m_shipAngle +
                 (left)
                 -
                 (right);

   if (up)
   {
      // angle the ship should go
      setAngle(m_shipAngle);
      drawFire(getPoint(),getAngle());
      setSpeed(0.2);
      *this += *this;
   }
}

/**********************************************************
 * Draws ship
 **********************************************************/
void Ship::draw()
{
   drawShip(getPoint(), m_shipAngle);
}

/**********************************************************
 * Operator ++ : moves the ship
 **********************************************************/
void Ship::operator ++ (int postfix)
{
   wrap();
   addX(getDx());
   addY(getDy());
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//                                                       //
//                       BULLET                          //
//                                                       //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////


/**********************************************************
*
 **********************************************************/
Bullet::Bullet() : Movable()
{
   // set the starting position of the bullets off the screen
   setX (250);
   setY (250);
   setDx(0);
   setDy(0);

   m_fWrap   = false;
   m_isFired = false;
   m_framesToLive = MAX_FRAMES;
}


/**********************************************************
 * Operator ++
 **********************************************************/
void Bullet::operator ++ (int postfix)
{
   if (m_fWrap)
      wrap();
   addX(getDx());
   addY(getDy());
}

/**********************************************************
 * Die : kills bullet
 **********************************************************/
void Bullet::draw()
{
   drawDot(getPoint());
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//                                                       //
//                        ROCK                           //
//                                                       //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

/**********************************************************
 *
 **********************************************************/
void Rock::draw()
{
   drawCircle(getPoint(), m_radius, m_points, m_rotation);
}

/**********************************************************
 *
 **********************************************************/
void Rock::move()
{
   wrap();
   addX(getDx());
   addY(getDy());
   m_rotation++;
}

/**********************************************************
 *
 **********************************************************/
void Rock::operator ++ (int)
{
   wrap();
   addX(getDx());
   addY(getDy());
   m_rotation++;
}

/**********************************************************
 *
 **********************************************************/
BigRock::BigRock() : Rock()
{
   m_size     = BIG;
   m_points   = 6;
   m_rotation = 0;
   m_radius   = 20;

   setX(random(-200, 200));
   setY(random(-200, 200));

   (getX() > 0) ? setDx(1 -  rand() % 4)
                : setDx(1 + -rand() % 4);
   (getY() > 0) ? setDy(1 -  rand() % 4)
                : setDy(1 + -rand() % 4);
}

/**********************************************************
 *
 **********************************************************/
MediumRock::MediumRock() : Rock()
{
   m_size     = MEDIUM;
   m_points   = 4;
   m_rotation = 0;
   m_radius   = 16;
}

/**********************************************************
 *
 **********************************************************/
SmallRock::SmallRock() : Rock()
{
   m_size     = SMALL;
   m_points   = 3;
   m_rotation = 0;
   m_radius   = 13;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//                                                       //
//                        SCORE                          //
//                                                       //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

/**********************************************************
 *
 **********************************************************/
Score::Score()
{
   m_scoreLocation.setX(-198);
   m_scoreLocation.setY( 198);
   m_score = 0;
}

/**********************************************************
 *
 **********************************************************/
void Score::drawScore()
{
   drawNumber(m_scoreLocation, m_score / 5);
}

